package com.ssish.saas.eccs.util;

import java.util.Properties;

import java.io.File;

import org.apache.commons.io.IOUtils;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.util.Vector;

import com.jcraft.jsch.Channel;

import com.jcraft.jsch.ChannelSftp;

import com.jcraft.jsch.JSch;

import com.jcraft.jsch.JSchException;

import com.jcraft.jsch.Session;

import com.jcraft.jsch.SftpException;

public class SFTPUtil {

    private String Type = "sftp";

    private ChannelSftp sftp;

    private Session session;

    private String username;// 登录用户名

    private String password;// 登录密码

    private String privateKey;// 私钥

    private String host;// 服务器地址IP地址

    private int port;// 端口

    /**
     * 
     * 构造基于密码认证的sftp对象
     */

    public SFTPUtil(String username, String password, String host, int port) {// port=22

        this.username = username;

        this.password = password;

        this.host = host;

        this.port = port;

    }

    /**
     * 
     * 构造基于秘钥认证的sftp对象
     */

    public SFTPUtil(String username, String host, int port, String privateKey) {

        this.username = username;

        this.host = host;

        this.port = port;

        this.privateKey = privateKey;

    }

    public SFTPUtil() {

    }

    /**
     * 
     * 连接sftp服务器
     */

    public void login() {

        try {

            JSch jsch = new JSch();

            if (privateKey != null) {

                jsch.addIdentity(privateKey);// 设置私钥

            }

            session = jsch.getSession(username, host, port);

            if (password != null) {

                session.setPassword(password);

            }

            session.setTimeout(100000);

            Properties config = new Properties();

            config.put("StrictHostKeyChecking", "no");

            session.setConfig(config);

            session.connect();

            Channel channel = session.openChannel(Type);

            channel.connect();

            sftp = (ChannelSftp)channel;

        } catch (JSchException e) {

            e.printStackTrace();

        }

    }

    /**
     * 
     * 关闭连接 server
     */

    public void logout() {

        if (sftp != null) {

            if (sftp.isConnected()) {

                sftp.disconnect();

            }

        }

        if (session != null) {

            if (session.isConnected()) {

                session.disconnect();

            }

        }

    }

    /**
     * 
     * 将输入流的数据上传到sftp作为文件。文件完整路径=basePath+directory
     * 
     * @param basePath
     *            服务器的基础路径
     * 
     * @param directory
     *            上传到该目录
     * 
     * @param sftpFileName
     *            sftp端文件名
     * 
     * @param in
     *            输入流
     */

    public void upload(String basePath, String directory, String sftpFileName, InputStream input) throws SftpException {

        try {

            sftp.cd(basePath);

            sftp.cd(directory);

        } catch (SftpException e) {

            // 目录不存在，则创建文件夹

            String[] dirs = directory.split("/");

            String tempPath = basePath;

            for (String dir : dirs) {

                if (null == dir || "".equals(dir))
                    continue;

                tempPath += "/" + dir;

                try {

                    sftp.cd(tempPath);

                } catch (SftpException ex) {

                    sftp.mkdir(tempPath);

                    sftp.cd(tempPath);

                }

            }

        }

        System.out.println("upload begin");
        sftp.put(input, sftpFileName); // 上传文件
        System.out.println("upload end");   
    }

    /**
     * 
     * 下载文件。
     * 
     * @param directory
     *            下载目录
     * 
     * @param downloadFile
     *            下载的文件
     * 
     * @param saveFile
     *            存在本地的路径
     */

    public void download(String directory, String downloadFile, String saveFile) throws SftpException,
        FileNotFoundException {

        if (directory != null && !"".equals(directory)) {

            sftp.cd(directory);

        }

        File file = new File(saveFile);

        sftp.get(downloadFile, new FileOutputStream(file));

    }

    /**
     * 
     * 下载文件
     * 
     * @param directory
     *            下载目录
     * 
     * @param downloadFile
     *            下载的文件名
     * 
     * @return 字节数组
     */

    public byte[] download(String directory, String downloadFile) throws SftpException, IOException {

        if (directory != null && !"".equals(directory)) {

            sftp.cd(directory);

        }

        InputStream is = sftp.get(downloadFile);

        byte[] fileData = IOUtils.toByteArray(is);

        return fileData;

    }
    public InputStream downloadForStream(String directory, String downloadFile) throws SftpException, IOException {
        if (directory != null && !"".equals(directory)) {

            sftp.cd(directory);

        }

        InputStream is = sftp.get(downloadFile);


        return is;

    }

    /**
     * 
     * 删除文件
     * 
     * @param directory
     *            要删除文件所在目录
     * 
     * @param deleteFile
     *            要删除的文件
     */

    public void delete(String directory, String deleteFile) throws SftpException {

        sftp.cd(directory);

        sftp.rm(deleteFile);

    }

    /**
     * 
     * 列出目录下的文件
     * 
     * @param directory
     *            要列出的目录
     * 
     * @param sftp
     */

    public Vector<?> listFiles(String directory) throws SftpException {

        return sftp.ls(directory);

    }

    /**
     * 
     * main方法测试
     * 
     * @param args
     * 
     * @throws SftpException
     * 
     * @throws JSchException
     * 
     * @throws SftpException
     * 
     * @throws FileNotFoundException
     * @throws IOException 
     */

    public static void main(String[] args) throws JSchException, SftpException, IOException {

        SFTPUtil sftp = new SFTPUtil("root", "NANYANssi2018", "47.102.42.202", 22);// 2.0开发环节测试

        sftp.login();

        File file = new File("D:\\1006.jpg");

        InputStream is = new FileInputStream(file);

        System.out.println("==upload前=");

//        sftp.upload("/datavg/lnh", "", "1006.jpg", is);

        System.out.println("==upload后=");
        InputStream in= sftp.downloadForStream("/datavg/lnh", "1006.jpg");
        sftp.upload("/datavg/lnh", "", "1007.jpg", is);
        try {
            byte[] b = sftp.download("/datavg/lnh", "1006.jpg");
            
            String str = new String(b, "utf-8");
            System.out.println(str);
//            sftp.delete("/datavg/lnh", "test.txt");
        } catch (IOException e) {
            // TODO Auto-generated catch block
             e.printStackTrace();
        }

        sftp.logout();

    }

}